package Planificador;

import java.util.ArrayList;

public class Registro {

	protected int quantum;
	protected String origen;
	protected String destino;
	protected Proceso proceso;

	private static ArrayList<Registro> sucesos = new ArrayList<Registro>();

	public Registro(int quantum, String origen, String destino, Proceso proceso) {
		this.quantum = quantum;
		this.origen = origen;
		this.destino = destino;
		this.proceso = proceso;

	}

	public int getQuantum() {
		return this.quantum;
	}

	public String getOrigen() {
		return this.origen;
	}

	public String getOrigen(boolean b) {

		return this.getOrigen();
	}

	public String getDestino() {
		return this.destino;
	}

	public String getDestino(boolean b) {
		if (this.destino.isEmpty() && !this.origen.isEmpty()) {
			return "Fin";
		}
		return this.getDestino();
	}

	public Proceso getProceso() {
		return this.proceso;
	}

	public static void reset() {
		Registro.sucesos = new ArrayList<Registro>();
	}

	public static void entradaProceso(int quantum, Proceso p) {
		Registro.moviento(p, "", "nuevos");
	}

	public static void salidaProceso(int quantum, Proceso p) {
		Registro.moviento(p, "procesador", "");
	}

	public static void moviento(Proceso p, String origen, String destino) {
		Registro.sucesos.add(new Registro(SistemaOperativo.getQuantum(),
				origen, destino, p));
	}

	public static void movientoHack(Proceso p, String origen, String destino) {
		Registro.sucesos.add(new Registro(SistemaOperativo.getQuantum() + 1,
				origen, destino, p));
	}

	public static ArrayList<Registro> getSucesos() {
		return Registro.sucesos;
	}

	public static ArrayList<Registro> getSucesos(int quantum) {
		ArrayList<Registro> sucesosFiltrados = new ArrayList<Registro>();
		for (Registro registro : Registro.sucesos) {
			if (registro.getQuantum() == quantum) {
				sucesosFiltrados.add(registro);
			}

		}
		return sucesosFiltrados;
	}

	public static ArrayList<Registro> getSucesos(Proceso p) {
		ArrayList<Registro> sucesosFiltrados = new ArrayList<Registro>();
		for (Registro registro : Registro.sucesos) {
			if (registro.getProceso() == p) {
				sucesosFiltrados.add(registro);
			}

		}
		return sucesosFiltrados;
	}

	public static Registro getRegistro(int quantum, Proceso p)
			throws NoRegistroException {
		Registro suceso = null;

		for (Registro r : Registro.sucesos) {
			if (r.proceso == p) {
				if (r.quantum > quantum)
					break;
				suceso = r;
			}
		}

		if (suceso == null)
			throw new NoRegistroException();

		return suceso;
	}

	@Override
	public String toString() {

		return "[" + this.quantum + ", " + this.origen + ", " + this.destino
				+ ", " + this.proceso + "]";
	}

}
